#ifndef ALARM_VIEW_H
#define ALARM_VIEW_H

#include <QWidget>
#include <QTableWidget>
#include "state_info.h"
#include "alarm_record.h"
#include "alarm_rule.h"
#include "alarm_record.h"

namespace Ui
{
    class AlarmView;
}

class PanelMainWindow;
class SearchTreeWidget;
class DealerHandler;

class AlarmView : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     *
     * @param parent 父窗口
     * @param state_info 主站信息
     * @param state_info_vec 子站信息列表
     */
    explicit AlarmView(SearchTreeWidget *search_tree, QWidget *parent = nullptr);
    ~AlarmView();

protected:
    void showEvent(QShowEvent *event) override;

private slots:
    /**
     * @brief 处理tab切换事件
     * @param index 当前选中的tab索引
     */
    void onTabChanged(int index);

    /**
     * @brief 处理网络消息
     * @param method 方法
     * @param body 消息体
     */
    void onNetworkMessageReceived(const QString &method, const QString &body);

    /**
     * @brief 处理树节点的点击事件
     * @param state_info 变电站结构体
     */
    void onSearchTreeWidgetItemClicked(StateInfo state_info);

private:
    /**
     * @brief 初始化告警列表
     */
    void initAlarmList();

    /**
     * @brief 初始化表格控件
     * @param table 要初始化的表格控件
     */
    void initTableWidget(QTableWidget *table);

    /**
     * @brief 添加告警记录到表格
     * @param table 目标表格
     * @param alarm_record 告警记录
     */
    void addAlarmRecord(QTableWidget *table, AlarmRecord *alarm_record);

    /**
     * @brief 清空所有表格
     */
    void clearAllTables();

    /**
     * @brief 添加告警记录到列表
     * @param id 告警记录ID
     * @param status 告警记录状态
     * @param alarm_rule_id 告警规则ID
     * @param substation_id 变电站ID
     * @param substation_desc 变电站描述
     * @param point_id 点ID
     * @param point_address 点地址
     * @param max_threshold 最大阈值
     * @param create_at 创建时间
     * @param update_at 更新时间
     * @param interval_secs 告警规则间隔时间
     * @param threshold_value 告警规则阈值
     * @param metric_type 告警规则指标类型
     * @param threshold_unit 告警规则阈值单位
     * @param alarm_level 告警规则告警级别
     * @return 队列索引
     */
    int appendAlarmRecord(int64_t id, int status, int64_t alarm_rule_id, int64_t substation_id, QString substation_desc,
                          int64_t point_id, int point_address, double max_threshold, int64_t create_at, int64_t update_at,
                          int interval_secs, double threshold_value, MetricTypeEnum metric_type, ThresholdUnitEnum threshold_unit, AlarmLevelEnum alarm_level);

    /**
     * @brief 渲染告警表
     */
    void renderAlarmTable();

private:
    /**
     * @brief 界面
     */
    Ui::AlarmView *ui_;

    /**
     * @brief 搜索树
     */
    SearchTreeWidget *search_tree_;

    /**
     * @brief 主站信息
     */
    StateInfo state_info_;

    /**
     * @brief 经销商处理类
     */
    DealerHandler *dealer_handler_;

    /**
     * @brief 告警记录列表
     */
    QVector<AlarmRecord *> alarm_record_vec_;
};

#endif // ALARM_VIEW_H
